﻿//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#region << 版 本 注 释 >>

/*----------------------------------------------------------------
* 类 名 称 ：ResizeableArray
* 类 描 述 ：
* 作    者 ：henrychang
* 创建时间 ：2019/1/7 14:20:55
*******************************************************************
* Copyright @ henrychang 2018. All rights reserved.
*******************************************************************
//----------------------------------------------------------------*/

#endregion << 版 本 注 释 >>

using System;
using System.Linq;

namespace TouchFish.DataStructure
{
    /// <summary>
    /// 可自动调节大小的数组
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ResizeableArray<T> where T : class
    {
        private T[] _array;

        public T this[int index]
        {
            get { return _array[index]; }
        }

        public int Count
        {
            get { return _array.Length; }
        }

        public ResizeableArray(int initCount)
        {
            _array = new T[initCount];
        }

        public void Append(T itemToAdd)
        {
            Array.Resize(ref _array, _array.Length + 1);
            _array[_array.Length - 1] = itemToAdd;
        }

        public void Clear()
        {
            Array.Clear(_array, 0, _array.Length);
        }

        public void Remove(
            T itemToRemove)
        {
            var size = _array.Length;

            var newIndex = 0;
            for (var i = 0; i < size; i++)
            {
                if (_array[i] == itemToRemove)
                {
                    _array[i] = null;
                    continue;
                }

                _array[newIndex] = _array[i];
                newIndex++;
            }

            Array.Resize(ref _array, _array.Length - 1);
        }

        public void RemoveAt(int index)
        {
            var size = _array.Length;

            _array[index] = null;

            for (var i = index; i < size - 1; i++)
            {
                _array[i] = _array[i + 1];
            }

            Array.Resize(ref _array, _array.Length - 1);
        }

        public bool Contains(T item)
        {
            return _array.Contains(item);
        }
    }
}